# coding=utf-8
# 这是一个示例 Python 脚本,测试运行字典 dict 数据

if __name__ == '__main__':
    # 定义新的字典
    my_dict = {"name": "Sun", "age": 23, "sex": "male"}
    # 字典访问
    print my_dict
    print my_dict["name"]
    print my_dict["age"]
    print my_dict["sex"]
    # 键值对数量
    print len(my_dict)

    # 定义新的字典
    name_dict = {1: {"name": "Liu", "age": 20, "sex": "male"},
                 2: {"name": "Zhang", "age": 20, "sex": "female"}}
    # 字典访问
    print name_dict
    print name_dict[1]
    print name_dict[2]["sex"]
    # 键值对数量
    print len(name_dict)

    # 添加新的键值对
    name_dict[4] = {"name": "Hu", "age": 10, "sex": "None"}
    print name_dict[4]
    print len(name_dict)

    # 修改字典key=4，sex的值
    name_dict[4]["sex"] = "male"
    print name_dict[4]["sex"]

    # 比较两个字典元素的值
    # 注意：字典比对，首先比对age，相等则继续比较name，相等则比较sex
    print "cmp", cmp(name_dict[1], name_dict[2])
    print "cmp", cmp(name_dict[1]["name"], name_dict[2]["name"])  # liu< zhang
    print "cmp", cmp(name_dict[1]["age"], name_dict[2]["age"])  # 20 == 20
    print "cmp", cmp(name_dict[1]["sex"], name_dict[2]["sex"])  # male > female

    # type 字典数据类型
    print type(name_dict)

    # 以tup元组为键，生成字典，值为Xie（缺省值为none）
    tup = (3, 5)
    my_dict = dict.fromkeys(tup, "Xie")
    print my_dict
    # del my_dict

    # 获取键对应的值
    print name_dict.get(1)
    # __getitem__ 和 get 的区别
    print name_dict.__getitem__(2)

    # 判断字典内是否存在键
    print name_dict.has_key(3)
    print 4 in name_dict

    # 获取可遍历的键值对 键 值 ，返回的数据结构是列表
    print name_dict.items()
    print name_dict.keys()
    print name_dict.values()
    # 返回迭代器
    print name_dict.iteritems()
    print name_dict.iterkeys()
    print name_dict.itervalues()

    # 删除指定键值对，
    name_dict.pop(4)
    print name_dict.keys()

    # 删除最早插入的键，（随机？）
    name_dict.popitem()
    print name_dict.keys()

    # 字典的键值对视图 键视图 值视图,打印有区别
    print name_dict.viewitems()
    print name_dict.items()
    print name_dict.viewvalues()
    print name_dict.values()
    print name_dict.viewkeys()
    print name_dict.keys()

    # 浅拷贝 指向同一块内存区域
    copy_dict = name_dict.copy()
    name_dict[2]["age"] = 10
    print name_dict[2]["age"], copy_dict[2]["age"]

    # 如果键在字典中，返回这个键所对应的值。如果键不在字典中，向字典中插入这个键，并且以default为这个键的值，并返回 default。
    # default的默认值为None
    name_dict.setdefault(7)
    print name_dict.keys()

    # 将my_dict字典的键值对一次性全部添加到name_dict字典对象，当name_dict字典为空时，相当于深复制
    # 如果两个字典中存在相同的键，则进行值的更新。
    print my_dict.keys()
    name_dict.update(my_dict)
    print name_dict.keys()

    # 下面这句话会报错，因为name_dict没有key=3的键值对
    # del name_dict[3]

    # 删除一个键值对，如字典内无该键值
    name_dict[4] = {}
    del name_dict[4]
    print len(name_dict)

    # 清空字典
    name_dict.clear()
    print len(name_dict)

    # 删除整个字典
    del name_dict
    # 下面这句话会报错，因为 name_dict 已经被删除，not defined
    # print name_dict
